package com.cskaoyan.javase.string.notvar2;

/**
 * @description: 字符串常量池
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 思考：“Hello”是一个什么？ 字面值常量
 * 明确：
 * “Hello”就是一个对象，字符串对象
 * "hello"是一个字面值常量，这个常量在整个Java程序的运行期间不会发生变化
 * 于是在编译时期，Java会把这个字符串字面值常量作为对象加入字符串常量池
 *
 * > Java当中所有双引号引起来的字符串都是字符串对象
 * - 每一个字符串字面值都作为一个对象存储在堆上的字符串常量池中
 *   - 字面值常量编译时期，就能确定其取值，编译时期加入常量池
 *   - 当后续再使用字面值创建相同内容的字符串对象时，直接将该对象返回给引用 s= "hello"
 *      于是实现了字符串对象的共享
 *   - 如果使用new关键字创建相同内容字符串对象，对象不共享，但是字符数组仍然共享
 *
 *
 * 字符串是JVM堆内存中最多的对象，字符串不可变后，就可以共享，节省了大量的堆内存空间
 *      不可变是能够共享的前提，如果可变的话，肯定是不能共享的。
 * 不可变后还变得更安全（多线程可以体现）
 *      有很多线程来修改它，我现在没有改，但是等我再次去看的时候，发现被别人改了
 * 不可变后效率提升（简单举例：新建数组并且共享很快，但是移动拷贝数组很难）
 *
 */
public class Demo2 {
    public static void main(String[] args) {
        String s = "hello";
        String s2 = "hello";
        System.out.println(s == s2);
        String s3 = new String("hello");

        System.out.println(s == s3); //false
        System.out.println(s2 == s3); //false
    }
}
